package hyl.base.net.nio;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.SocketChannel;

import hyl.base.net.ASocket;

/*服务器端，:接收客户端发送过来的数据并显示，
 *服务器把上接收到的数据加上"echo from service:"再发送回去*/
public abstract class NIOSocket extends ASocket {

	/* 服务器地址 */

	static final int TimeOut = 3000;
	static final int I连接数 = 100;

	public static boolean send(SocketChannel sc, NIOData1 数据包) {
		try {
			sc.write(数据包.getSendBytes());
			return true;
		} catch (IOException e) {
			try {
				sc.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		return false;
	}

	/**
	 * 注意:<br>
	 * 网络断开以后, 通道的连接状态依然是true<br>
	 * 此时发送是不会抛出异常 <br>
	 * 只有发送以后才会修改连接状态为false<br>
	 * 
	 * @param sc
	 * @param 类型
	 * @param 数据包
	 * @return
	 */
	public static boolean send(SocketChannel sc, byte 类型, byte[] 数据包) {
		try {
			NIOData1 dp = new NIOData1();
			dp.i类型 = 类型;
			dp.data = 数据包;
			// System.out.println(sc.isConnected());
			sc.write(dp.getSendBytes());
			return true;
		} catch (IOException e) {
			try {
				sc.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		return false;

	}

	void read一次(SelectionKey key) throws IOException {
		// 得到并重置缓冲区的主要索引值
		NIOReader reader = (NIOReader) key.attachment();
		/* 通过reader获取对应的缓冲区 */
		ByteBuffer buffer = reader.getReadBuf();
		// 获得与客户端通信的信道
		SocketChannel sc = (SocketChannel) key.channel();
		if (!sc.isConnected())
			return;
		/* 从底层socket读缓冲区中读入数据 */
		// int len = 0;
		// int n=0;
		buffer.clear();
		while (sc.read(buffer) > 0) {
			buffer.flip();
			reader.putData(buffer);
			buffer.clear();
		}

		// 没有读取到内容的情况
		// sc.close();

		// 设置为下一次读取或是写入做准备
		// key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
	}

}
